package com.stronger.pettern.Strategy;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 消息策略环境类(策略Bean的工厂)
 * 在初始化MessageContext对象时，将实现MessageStrategy接口的所有类对象存储到Map结构中，
 * Key为消息类型（如QQ、WeChat、SMS），Value为对应的消息实现类。
 * 通过getMessageStrategy方法，你可以根据messageType从Map中拿到对应的消息策略，
 * 从而隐藏了策略的具体实现逻辑。这种方式可以遵循开闭原则，因为在新增消息类型时，只需要增加对应的实现类，
 * 并将其存储到Map中即可，而不需要修改原有的代码。
 */
@Component
public class MessageContext {
    private static final Map<String, MessgeStrategy> messageStrategyMap = new HashMap<>(16);

    /**
     * 对象初始化时，将所有策略实现类塞进Map中
     * @param messageStrategyList
     */

    public MessageContext(List<MessgeStrategy> messageStrategyList) {
        messageStrategyList.forEach(strategy -> messageStrategyMap.put(strategy.getMessageType(), strategy));
    }

    /**
     * 根据messageType获取对应的消息策略实现类
     * @param messageType
     * @return
     */
    public MessgeStrategy getMessageStrategy(String messageType) {
        MessgeStrategy messageStrategy = messageStrategyMap.get(messageType);
        if (messageStrategy == null) {
            throw new RuntimeException("messageType inValid!");
        }
        return messageStrategy;
    }
}
